package com.liu.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.liu.conest.LogType;
import com.liu.config.RedisConfig;
import com.liu.config.SystemConfig;
import com.liu.dao.SmsLogDao;
import com.liu.entity.SmsLog;
import com.liu.service.intf.SmsLogService;
import com.liu.utils.AliSmsUtil;
import com.liu.utils.JedisUtils;
import com.liu.utils.NumUtils;
import com.liu.utils.StringUtils;
import com.liu.vo.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;

/**
 * ━━━━━━神兽出没━━━━━━
 * 　　　┏┓　　　┏┓
 * 　　┏┛┻━━━┛┻┓
 * 　　┃　　　　　　 ┃
 * 　　┃　　　━　　　┃
 * 　　┃　┳┛　┗┳　  ┃
 * 　　┃　　　　　　 ┃
 * 　　┃　　　┻　　　┃
 * 　　┃　　　　　　　┃
 * 　　┗━┓　　　┏━┛Code is far away from bug with the animal protecting
 * 　　　　┃　　　┃    神兽保佑,代码无bug
 * 　　　　┃　　　┃
 * 　　　　┃　　　┗━━━┓
 * 　　　　┃　　　　　　　┣┓
 * 　　　　┃　　　　　　　┏┛
 * 　　　　┗┓┓┏━┳┓┏┛
 * 　　　　　┃┫┫　┃┫┫
 * 　　　　　┗┻┛　┗┻┛
 * ━━━━━━永无BUG!━━━━━━
 */
@Service
public class SmsLogServiceImpl implements SmsLogService {
    @Autowired
    private SmsLogDao smsLogDao;

    @Override
    public R sendLoginCode(String phone) {
        //1.校验
        if (StringUtils.isNoyEmpty(phone)) {
            //2.生成 6 魔法值：直接出现的数字，开发中应该积极避免魔法值，实际开发中应该变量进行定义 出自《阿里巴巴Java开发规范》
            int code = NumUtils.createNum(6);
            //3.发送
            if (AliSmsUtil.sendFCode(phone, code)) {
                //4.存储 Redis(1.为什么 2.用什么数据类型 3.要不要设置有效期)
                JedisUtils.setStr(RedisConfig.SMS_CODE_LOGIN + phone, code + "", RedisConfig.SMS_CODE_LOGIN_TIME);
                //5.保存数据到数据库中 1 是魔法值 应该使用变量代替
                smsLogDao.insert(new SmsLog(phone, SystemConfig.SMS_TYPE_LOGIN, "发送登录的短信验证码", new Date()));
                //6.返回
                return R.ok();
            }
        }
        return R.fail("亲，网络故障！");
    }

    @Override
    public R queryAll(String phone) {
        QueryWrapper<SmsLog> queryWrapper = new QueryWrapper<SmsLog>();
        //1.校验
        if (StringUtils.isNoyEmpty(phone)) {
            queryWrapper.eq("phone", phone);
        }
        //2.查询返回
        return R.ok(smsLogDao.selectList(queryWrapper));
    }

    @Override
    public R sendPhoneRegisterCode(String phone) {
        System.out.println(phone);

        //入参检测
        if (StringUtils.isNoyEmpty(phone) && phone.matches(SystemConfig.Phone_REG)) {
            int code = NumUtils.createNum(6);
            if (AliSmsUtil.sendVCode(phone, code)) {
                JedisUtils.setStr(RedisConfig.SMS_CODE_REGISTER + phone, code + "", RedisConfig.SMS_CODE_LOGIN_TIME);
                smsLogDao.insert(new SmsLog(phone, SystemConfig.SMS_TYPE_REGISTER, "发送注册短信", new Date()));
                return R.ok("注册短信发送成功");
            }else {
                return R.fail("网络异常短信发送失败");
            }
        }else {
            return R.fail("手机号不正确");
        }

    }

    public R sendFindCode(String phone) {
        //入参检测
        if (StringUtils.isNoyEmpty(phone) && phone.matches(SystemConfig.Phone_REG)) {
            int code = NumUtils.createNum(6);
            if (AliSmsUtil.sendFCode(phone, code)) {
                JedisUtils.setStr(RedisConfig.SMS_CODE_FIND + phone, code + "", RedisConfig.SMS_CODE_LOGIN_TIME);
                smsLogDao.insert(new SmsLog(phone, LogType.密码找回.getValue(), "发送找回密码短信", new Date()));
                return R.ok("验证码发送成功");
            } else {
                return R.fail("网络请求失败,请稍后再试");
            }
        } else {
            return R.fail("手机或者验证码不正确");
        }
    }
}
